package com.kpl.kplstzble.downkplfile;


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpDownloader {
    /**
     * 声明一个URL对象
     */
    private URL url = null;

    /**
     * 根据URL下载文件，下载的文件需要是文本文件
     * urlStr :网络链接地址
     * 返回值是一个String对象，这个对象包含了文本里面的内容
     * <p>
     * <p>
     * 从网络上下载一个文本文件的步骤：
     * <p>
     * 1.创建一个URL对象
     * 2.通过URL对象，创建一个HttpURLConnection对象
     * 3.得到InputSteam
     * 4.从InputStream当中读取数据
     */
    public String download(String urlStr) {

        /**声明一个字符串数组对象*/
        StringBuffer stringBuffer = new StringBuffer();
        String line = null;

        /**生成一个BufferedReader对象，
         * 这个类里面有一个readLine方法很好用
         * 可以每次读取一行数据
         * */
        BufferedReader bufferedReader = null;
        try {
            /**创建一个URL对象，传入参数为网络下载地址
             * 这样可以生成一个代表这个网络地址的URL对象
             * */
            url = new URL(urlStr);
            /**创建一个Http连接
             * 这个对象就代表了这个网络地址的一个http链接
             * */
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

            /**
             * httpURLConnection.getInputStream() 以字节的方式读取需要下载文件
             * InputStreamReader 把一个字节流转换成字符流
             * BufferedReader 把字符流套上一个BufferedReader装饰方便一行一行的读取
             */
            bufferedReader = new BufferedReader(
                    new InputStreamReader(
                            httpURLConnection.getInputStream()
                    )
            );
            /**
             * 以行为单位读取数据，每次读取一行，并把这一行字符返回到line中
             * 当line不为null指针，说明line里面有数据
             * 这时候变把读取的的这行字符line对象添加到将要返回的stringBuffer中
             * 当字符读取完毕，readLine方法没有读取到数据便返回一个null，此时跳出while
             * */
            while ((line = bufferedReader.readLine()) != null) {
                stringBuffer.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                bufferedReader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return stringBuffer.toString();
    }

    /**
     * 下载任意形式的文件
     * <p>
     * urlStr   ：需要下载文件的文件网络下载链接
     * path     ：下载完文件后所存放的SD卡里面的目录
     * FileName ：下载好后文件的命名
     * 整形返回值
     * -1   下载文件出错
     * 0    下载文件成功
     * 1    代表文件已经存在
     */
    public int downloadFile(String urlStr, String path, String fileName) {

        /**声明一个输入流*/
        InputStream inputStream = null;
        try {
            //生成一个FileUtils对象
            FileUtils fileUtils = new FileUtils();

         /*   if (fileUtils.isFileExist(path + fileName)) {
                return 1;//文件已经存在了
            } else {*/
                //得到网络下载地址多对应的下载链接
                inputStream = getInputStreamFromUrl(urlStr);

                //向SD卡写入得到输入流
                File file = fileUtils.writeInputStream2SD(path,fileName,inputStream);
                if(file == null)
                    return -1;
           // }
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        } finally {
            try{
                inputStream.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return 0;
    }

    /**
     * 根据url得到输入流
     * <p>
     * urlStr   :网络链接地址
     * <p>
     * 返回参数：网络连接多对应的数据流
     */
    public InputStream getInputStreamFromUrl(String urlStr)
            throws MalformedURLException, IOException {

        //通过下载链接作为参数得到一个URL的对象
        url = new URL(urlStr);

        //调用url的openConnection方法得到一个代表这个下载链接的http链接对象
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        //通过这个http链接得到这个链接所对应的输入流
        InputStream inputStream = httpURLConnection.getInputStream();
        return inputStream;
    }
}
